P4 - Explore e resuma os dados

Bibliotecas utilizadas no projeto:

library('ggplot2')
library(readr)
library(grid)
library(gridExtra)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Carregando os dados:

## Warning: Missing column names filled in: 'X1' [1]
## Parsed with column specification:
## cols(
##   X1 = col_integer(),
##   fixed.acidity = col_double(),
##   volatile.acidity = col_double(),
##   citric.acid = col_double(),
##   residual.sugar = col_double(),
##   chlorides = col_double(),
##   free.sulfur.dioxide = col_double(),
##   total.sulfur.dioxide = col_integer(),
##   density = col_double(),
##   pH = col_double(),
##   sulphates = col_double(),
##   alcohol = col_double(),
##   quality = col_integer()
## )
## Warning in rbind(names(probs), probs_f): number of columns of result is not
## a multiple of vector length (arg 1)
## Warning: 2 parsing failures.
## row # A tibble: 2 x 5 col     row                  col               expected actual expected   <int>                <chr>                  <chr>  <chr> actual 1  1296 total.sulfur.dioxide no trailing characters     .5 file 2  1297 total.sulfur.dioxide no trailing characters     .5 row # ... with 1 more variables: file <chr>

Funções auxiliares:

Essas funções foram criadas para facilitar o entendimento do código e também diminuir seu tamanho na hora da criação dos gráficos.

Qual é a estrutura do conjunto de dados?

#funcao que retorna o nome das colunas
names(wineQualityReds)
##  [1] "X1"                   "fixed.acidity"        "volatile.acidity"    
##  [4] "citric.acid"          "residual.sugar"       "chlorides"           
##  [7] "free.sulfur.dioxide"  "total.sulfur.dioxide" "density"             
## [10] "pH"                   "sulphates"            "alcohol"             
## [13] "quality"
##        X1         fixed.acidity   volatile.acidity  citric.acid   
##  Min.   :   1.0   Min.   : 4.60   Min.   :0.1200   Min.   :0.000  
##  1st Qu.: 400.5   1st Qu.: 7.10   1st Qu.:0.3900   1st Qu.:0.090  
##  Median : 800.0   Median : 7.90   Median :0.5200   Median :0.260  
##  Mean   : 800.0   Mean   : 8.32   Mean   :0.5278   Mean   :0.271  
##  3rd Qu.:1199.5   3rd Qu.: 9.20   3rd Qu.:0.6400   3rd Qu.:0.420  
##  Max.   :1599.0   Max.   :15.90   Max.   :1.5800   Max.   :1.000  
##                                                                   
##  residual.sugar     chlorides       free.sulfur.dioxide
##  Min.   : 0.900   Min.   :0.01200   Min.   : 1.00      
##  1st Qu.: 1.900   1st Qu.:0.07000   1st Qu.: 7.00      
##  Median : 2.200   Median :0.07900   Median :14.00      
##  Mean   : 2.539   Mean   :0.08747   Mean   :15.87      
##  3rd Qu.: 2.600   3rd Qu.:0.09000   3rd Qu.:21.00      
##  Max.   :15.500   Max.   :0.61100   Max.   :72.00      
##                                                        
##  total.sulfur.dioxide    density             pH          sulphates     
##  Min.   :  6.00       Min.   :0.9901   Min.   :2.740   Min.   :0.3300  
##  1st Qu.: 22.00       1st Qu.:0.9956   1st Qu.:3.210   1st Qu.:0.5500  
##  Median : 38.00       Median :0.9968   Median :3.310   Median :0.6200  
##  Mean   : 46.43       Mean   :0.9967   Mean   :3.311   Mean   :0.6581  
##  3rd Qu.: 62.00       3rd Qu.:0.9978   3rd Qu.:3.400   3rd Qu.:0.7300  
##  Max.   :289.00       Max.   :1.0037   Max.   :4.010   Max.   :2.0000  
##  NA's   :2                                                             
##     alcohol         quality     
##  Min.   : 8.40   Min.   :3.000  
##  1st Qu.: 9.50   1st Qu.:5.000  
##  Median :10.20   Median :6.000  
##  Mean   :10.42   Mean   :5.636  
##  3rd Qu.:11.10   3rd Qu.:6.000  
##  Max.   :14.90   Max.   :8.000  
## 

Algumas observações sobre nosso conjunto de dados:

  • Nossos dados consistem em 13 variáveis com aprox. 1600 registros :)
  • total.sulfur.dioxide é o que apresenta maior variabilidade nos dados (6.0 - 289.0)
  • Provavelmente exista algum erro na coluna density (max = 1001.00)
  • Não existem vinhos extremamente ruins, o range está entre 3 e 8

Removendo os valores NA’s da coluna total.sulfur.dioxide:

#removendo os valores NA 
wineQualityReds <- na.omit(wineQualityReds)

summary(wineQualityReds)
##        X1         fixed.acidity    volatile.acidity  citric.acid    
##  Min.   :   1.0   Min.   : 4.600   Min.   :0.1200   Min.   :0.0000  
##  1st Qu.: 400.0   1st Qu.: 7.100   1st Qu.:0.3900   1st Qu.:0.0900  
##  Median : 799.0   Median : 7.900   Median :0.5200   Median :0.2600  
##  Mean   : 799.4   Mean   : 8.322   Mean   :0.5277   Mean   :0.2713  
##  3rd Qu.:1198.0   3rd Qu.: 9.200   3rd Qu.:0.6400   3rd Qu.:0.4200  
##  Max.   :1599.0   Max.   :15.900   Max.   :1.5800   Max.   :1.0000  
##  residual.sugar     chlorides       free.sulfur.dioxide
##  Min.   : 0.900   Min.   :0.01200   Min.   : 1.00      
##  1st Qu.: 1.900   1st Qu.:0.07000   1st Qu.: 7.00      
##  Median : 2.200   Median :0.07900   Median :14.00      
##  Mean   : 2.537   Mean   :0.08746   Mean   :15.83      
##  3rd Qu.: 2.600   3rd Qu.:0.09000   3rd Qu.:21.00      
##  Max.   :15.500   Max.   :0.61100   Max.   :72.00      
##  total.sulfur.dioxide    density             pH          sulphates     
##  Min.   :  6.00       Min.   :0.9901   Min.   :2.740   Min.   :0.3300  
##  1st Qu.: 22.00       1st Qu.:0.9956   1st Qu.:3.210   1st Qu.:0.5500  
##  Median : 38.00       Median :0.9968   Median :3.310   Median :0.6200  
##  Mean   : 46.43       Mean   :0.9967   Mean   :3.311   Mean   :0.6584  
##  3rd Qu.: 62.00       3rd Qu.:0.9978   3rd Qu.:3.400   3rd Qu.:0.7300  
##  Max.   :289.00       Max.   :1.0037   Max.   :4.010   Max.   :2.0000  
##     alcohol         quality     
##  Min.   : 8.40   Min.   :3.000  
##  1st Qu.: 9.50   1st Qu.:5.000  
##  Median :10.20   Median :6.000  
##  Mean   :10.42   Mean   :5.637  
##  3rd Qu.:11.10   3rd Qu.:6.000  
##  Max.   :14.90   Max.   :8.000

Seção de Gráficos Univariados

O primeiro gráfico que farei é um histograma simples utilizando a qualidade do vinho como eixo X. Quero saber qual é o nível dos vinhos em nosso dataset!

Como podemos ver, a maioria dos vinhos em nosso dataset é de qualidade ou 5 ou 6, ou seja, são um pouco acima da média já que a escala é de 0 a 8.

Vamos olhar rapidamente para as outras variáveis!

#nesse trecho de codigo crio 8 graficos, uum por variavel e depois exibo-os em agrupamentos de 4 graficos cada
plot_fix_acid <- ggplot(wineQualityReds, aes(x = fixed.acidity)) +
                      geom_histogram(color = "white", fill = "#3366FF") +
                      ylab('Frequency') + 
                      xlab('Fixed Acidity (g / dm^3)') +
                      labs(title='2- Fixed Acidity Histogram')

plot_vol_acid <- ggplot(wineQualityReds, aes(x = volatile.acidity))+
                    ylab('Frequency') + 
                    xlab('Volatile Acidity (g / dm^3)') +
                    labs(title='3- Volatile Acidity Histogram') +
                    geom_histogram(fill = "#3366FF",bins = 100)

plot_cit_acid <- ggplot(wineQualityReds, aes(x = citric.acid))+
                    geom_histogram(color = "white", fill = "#3366FF") +
                    ylab('Frequency') + 
                    xlab('Citric Acid (g / dm^3)') +
                    labs(title='4- Citric Acid Histogram')

plot_res_sugar <- ggplot(wineQualityReds, aes(x = residual.sugar))+
                    geom_histogram(color = "white", fill = "#3366FF") +
                    ylab('Frequency') + 
                    xlab('Residual Sugar (g / dm^3)') +
                    labs(title='5- Residual Sugar Histogram')

plot_chlorides <- ggplot(wineQualityReds, aes(x = chlorides))+
                    geom_histogram(color = "white", fill = "#3366FF", bins = 50) +
                    ylab('Frequency') + 
                    xlab('Chlorides (g / dm^3)') +
                    labs(title='6- Chlorides Histogram')

plot_so2 <- ggplot(wineQualityReds, aes(x = total.sulfur.dioxide))+
                      geom_histogram(color = "white", fill = "#3366FF") +
                      ylab('Frequency') + 
                      xlab('SO2 (g / dm^3)') +
                      labs(title='7- SO2 Histogram')

plot_ph <- ggplot(wineQualityReds, aes(x = pH))+
                      geom_histogram(color = "white", fill = "#3366FF") +
                      ylab('Frequency') + 
                      xlab('pH') +
                      labs(title='8- pH Histogram') +
                      scale_x_continuous(breaks = seq(0,4,0.2))

plot_alcohol <- ggplot(wineQualityReds, aes(x = alcohol))+
                          geom_histogram(color = "white", fill = "#3366FF") +
                          ylab('Frequency') + 
                          xlab('Alcohol (% by volume)') +
                          labs(title='9- Alcohol Histogram')

grid.arrange(plot_fix_acid, plot_vol_acid, plot_cit_acid, plot_res_sugar, ncol = 2)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

grid.arrange(plot_chlorides, plot_so2, plot_ph, plot_alcohol, ncol = 2)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Algumas observações:

  • Gráfico 1: Como podemos perceber, a maioria dos nossos vinhos são de uma qualidade relativamente boa (5 ou 6)
  • Gráfico 2: Essa variável possue uma distribuição quase que normal, com uma leve inclinação positiva
  • Gráfico 3: Após corrigirmos os dados dessa coluna, o gráfico apresentou uma inclinação positiva
  • Gráfico 4: Aqui esse gráfico apresentou uma inclinação positiva com uma calda relativamente curta
  • Gráfico 5: Distribuição com inclinação positiva e uma calda longa
  • Gráfico 6: Distribuição positivamente inclinada com uma longa cauda a direita
  • Gráfico 7: Distribuição positivamente inclinada com uma longa cauda a direita
  • Gráfico 8: Esse é o que mais apresentou uma distribuição normal :)
  • Gráfico 9: Distribuição positivamente inclinada com uma leve cauda

Quais são os principais atributos de interesse deste conjunto de dados?

Para descobrirmos quais são os principais atributos aqui, vamos verificar quais tem que correlação com a coluna quality. Para isso existe a função cor() do r. Quão mais próximo o valor for de 1, mais positivamente é a correlação, ou seja, quão maior o valor da variável, maior será o da target. E assim é para quão mais próximo de -1, no caso seria inversamente proporcional.

##                   X1        fixed.acidity     volatile.acidity 
##           0.06758909           0.12320006          -0.39022587 
##          citric.acid       residual.sugar            chlorides 
##           0.22536054           0.01498493          -0.12884172 
##  free.sulfur.dioxide total.sulfur.dioxide              density 
##          -0.04769854          -0.18434369          -0.17563963 
##                   pH            sulphates              alcohol 
##          -0.05848341           0.25051925           0.47572001 
##              quality 
##           1.00000000

Como podemos observar, os principais atributos desse conjunto de dados são o alcohol, sulphates, volatile.acidity e citric.acid

Você criou novas variáveis a partir dos atributos existentes no conjunto de dados?

Sobre a coluna quality, irei criar uma label com três valores: - Ruim: (4,5] - Bom: (5,6] - Ótimo: (7,8]

#criando uma coluna nova
wineQualityReds$quality.label <- cut(wineQualityReds$quality, c(3, 4, 6, 10), 
                                     labels = c("ruim", "bom", "ótimo"),
                                     include.lowest = T)
summary(wineQualityReds$quality.label)
##  ruim   bom ótimo 
##    63  1317   217

Quais outros atributos você acha que podem lhe auxiliar na investigação destes atributos de interesse?

Vamos olhar quais atributos são mais relevantes para cada uma das três variáveis mencionadas acima! :)

Ácido Cítrico

# a funcao cor() retorna a correlacao entre as variaveis com a sua target, que eh passada como parametro
cor(wineQualityReds[,-14])[,'citric.acid']
##                   X1        fixed.acidity     volatile.acidity 
##          -0.15197133           0.67120591          -0.55228351 
##          citric.acid       residual.sugar            chlorides 
##           1.00000000           0.14607451           0.20427744 
##  free.sulfur.dioxide total.sulfur.dioxide              density 
##          -0.05558572           0.03724338           0.36439884 
##                   pH            sulphates              alcohol 
##          -0.54399501           0.31130106           0.10857619 
##              quality 
##           0.22536054

Aqui podemos ver que o que mais influencia é o atributo fixed.acidity, podemos perceber também o o pH tem grande influência nessa variável, porém de maneira negativa.

Sulfito

cor(wineQualityReds[,-14])[,'sulphates']
##                   X1        fixed.acidity     volatile.acidity 
##         -0.123859096          0.181768671         -0.260407811 
##          citric.acid       residual.sugar            chlorides 
##          0.311301059          0.007463648          0.371796054 
##  free.sulfur.dioxide total.sulfur.dioxide              density 
##          0.057284788          0.044465293          0.147730164 
##                   pH            sulphates              alcohol 
##         -0.198006469          1.000000000          0.092392709 
##              quality 
##          0.250519246

O que mais tem influência sob esse atributo é o citric.acid

Álcool

cor(wineQualityReds[,-14])[,'alcohol']
##                   X1        fixed.acidity     volatile.acidity 
##           0.24658445          -0.06280815          -0.20180471 
##          citric.acid       residual.sugar            chlorides 
##           0.10857619           0.04349416          -0.22111881 
##  free.sulfur.dioxide total.sulfur.dioxide              density 
##          -0.06626454          -0.20484057          -0.49720344 
##                   pH            sulphates              alcohol 
##           0.20501427           0.09239271           1.00000000 
##              quality 
##           0.47572001

Aqui o ph é o que mais tem influência nesse atributo!

Relembrando: - fixed.acidity - chlorides - ph - sulphates

Agora que listamos as outras quatro variáveis que serão usadas, mais à frente iremos analisá-las também!

Análise Bivariada

Vou fazer algumas análises abaixo para verificarmos a relação entre duas variáveis :)

Primeiro irei utilizar da biblioteca lsr, a função correlate que me dá a relação entre duas variávies!

## 
## CORRELATIONS
## ============
## - correlation type:  pearson 
## - correlations shown only when both variables are numeric
## 
##                          X1 fixed.acidity volatile.acidity citric.acid
## X1                        .        -0.268           -0.010      -0.152
## fixed.acidity        -0.268             .           -0.256       0.671
## volatile.acidity     -0.010        -0.256                .      -0.552
## citric.acid          -0.152         0.671           -0.552           .
## residual.sugar       -0.033         0.117            0.001       0.146
## chlorides            -0.120         0.094            0.061       0.204
## free.sulfur.dioxide   0.087        -0.151           -0.013      -0.056
## total.sulfur.dioxide -0.119        -0.112            0.076       0.037
## density              -0.368         0.668            0.022       0.364
## pH                    0.137        -0.685            0.236      -0.544
## sulphates            -0.124         0.182           -0.260       0.311
## alcohol               0.247        -0.063           -0.202       0.109
## quality               0.068         0.123           -0.390       0.225
## quality.label             .             .                .           .
##                      residual.sugar chlorides free.sulfur.dioxide
## X1                           -0.033    -0.120               0.087
## fixed.acidity                 0.117     0.094              -0.151
## volatile.acidity              0.001     0.061              -0.013
## citric.acid                   0.146     0.204              -0.056
## residual.sugar                    .     0.055               0.183
## chlorides                     0.055         .               0.005
## free.sulfur.dioxide           0.183     0.005                   .
## total.sulfur.dioxide          0.202     0.047               0.669
## density                       0.357     0.201              -0.019
## pH                           -0.085    -0.265               0.074
## sulphates                     0.007     0.372               0.057
## alcohol                       0.043    -0.221              -0.066
## quality                       0.015    -0.129              -0.048
## quality.label                     .         .                   .
##                      total.sulfur.dioxide density     pH sulphates alcohol
## X1                                 -0.119  -0.368  0.137    -0.124   0.247
## fixed.acidity                      -0.112   0.668 -0.685     0.182  -0.063
## volatile.acidity                    0.076   0.022  0.236    -0.260  -0.202
## citric.acid                         0.037   0.364 -0.544     0.311   0.109
## residual.sugar                      0.202   0.357 -0.085     0.007   0.043
## chlorides                           0.047   0.201 -0.265     0.372  -0.221
## free.sulfur.dioxide                 0.669  -0.019  0.074     0.057  -0.066
## total.sulfur.dioxide                    .   0.072 -0.066     0.044  -0.205
## density                             0.072       . -0.342     0.148  -0.497
## pH                                 -0.066  -0.342      .    -0.198   0.205
## sulphates                           0.044   0.148 -0.198         .   0.092
## alcohol                            -0.205  -0.497  0.205     0.092       .
## quality                            -0.184  -0.176 -0.058     0.251   0.476
## quality.label                           .       .      .         .       .
##                      quality quality.label
## X1                     0.068             .
## fixed.acidity          0.123             .
## volatile.acidity      -0.390             .
## citric.acid            0.225             .
## residual.sugar         0.015             .
## chlorides             -0.129             .
## free.sulfur.dioxide   -0.048             .
## total.sulfur.dioxide  -0.184             .
## density               -0.176             .
## pH                    -0.058             .
## sulphates              0.251             .
## alcohol                0.476             .
## quality                    .             .
## quality.label              .             .

Legal né? Mas é uma tabela, então é dificil tirar uma conclusão rápida!

Abaixo vou fazer um plot disso e você vai poder perceber o quão mais fácil fica :)

library(ellipse)
#craete new dataframe without categorical vars 
numeric_vars <- names(wineQualityReds) %in% c("quality.label", "rn")
rw_num <- wineQualityReds[!numeric_vars]
ctab <- cor(rw_num)
#plot which show correlation in more convenient way
colorfun <- colorRamp(c("#CC0000", "white", "#3366CC"), space = "Lab")
plotcorr(ctab, mar = c(0, 0, 0, 0), col = rgb(colorfun((ctab + 1) / 2), 
                                                  maxColorValue = 255))

Discuta sobre alguns dos relacionamentos observados nesta parte da investigação. Como os atributos de interesse variaram no conjunto de dados?

Apenas uma explicação rápida, quanto mais azul e mais inclinado para a direita, mais positivamente correlacionada as variáveis são. E quanto mais vermelho e mais inclinado para a esquerda, mais negativamente correlacionadas elas são!

Só de bater o olho já conseguimos ver 4 fortes correlações (2 positivas e 2 negativas) :)

Abaixo um resumo por variável:

  • fixed.acidity: correlação positiva com citric.acid, density negativa com pH
  • volatile.acidity: correlação negativa com citric.acid
  • citric.acid: correlação positiva com density e correlação negativa com fixed.acidity, - volatile.acidity, pH
  • chlorides: correlação positiva com sulphates
  • pH: correlação negativa com fixed.acidity, citric.acid, chlorides, density
  • alcohol: correlação negativa com density
  • density: correlação positiva com fixed.acidity, citric.acid, residual.sugar e correlação negativa com alcohol

E a nossa principal:

  • quality: aparentemente as que mais têm influência positiva nessa coluna são fixed.acidity, citric.acid, sulphates e alcohol

Vamos aqui olhar variável à variável em relação à nossa de qualidade :)

Citric Acid

box_plot_func(y_str = "citric.acid", 
              yl = "Citric acid (g / dm^3)",
              t = "Ácido Cítrico pela Qualidade")

by(wineQualityReds$citric.acid, wineQualityReds$quality.label,  summary)
## wineQualityReds$quality.label: ruim
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0200  0.0800  0.1737  0.2700  1.0000 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: bom
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0900  0.2400  0.2587  0.4000  0.7900 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: ótimo
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.3000  0.4000  0.3765  0.4900  0.7600

Muito bom esse plot! Podemos ver que existem pouqíssimos outliers :D Além disso, pode-se perceber que realmente essa coluna tem uma influência na qualidade do vinho

SO2

box_plot_func(y_str = "total.sulfur.dioxide", 
              yl = "Total SO2 (g / dm^3)",
              t = "SO2 pela Qualidade")

by(wineQualityReds$total.sulfur.dioxide, wineQualityReds$quality.label,  summary)
## wineQualityReds$quality.label: ruim
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    7.00   13.50   26.00   34.44   48.00  119.00 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: bom
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     6.0    24.0    40.0    48.9    65.0   165.0 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: ótimo
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    7.00   17.00   27.00   34.89   43.00  289.00

Aqui podemos já perceber que existem diversos outliers. Além disso não há muito o que comentar, já que possue um comportamento um tanto quanto similar entre os tipos de vinho.

Residual Sugar

box_plot_func(y_str = "residual.sugar", 
              yl = "Residual Sugar (g / dm^3)",
              t = "Açúcar pela Qualidade")

by(wineQualityReds$residual.sugar, wineQualityReds$quality.label,  summary)
## wineQualityReds$quality.label: ruim
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.200   1.900   2.100   2.685   2.950  12.900 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: bom
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.900   1.900   2.200   2.501   2.600  15.500 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: ótimo
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.200   2.000   2.300   2.709   2.700   8.900

Existem muitos outliers, principalmente em vinhos bons, mas no geral essa coluna tem um comportamento similar entre os diversos tipos.

pH

box_plot_func(y_str = "pH", 
              yl = "pH",
              t = "pH pela Qualidade")

by(wineQualityReds$pH, wineQualityReds$quality.label,  summary)
## wineQualityReds$quality.label: ruim
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.740   3.300   3.380   3.384   3.500   3.900 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: bom
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.860   3.210   3.310   3.311   3.400   4.010 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: ótimo
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.880   3.200   3.270   3.289   3.380   3.780

Existem alguns outliers, principalmente em vinhos bons, mas no geral essa coluna tem um comportamento similar entre os diversos tipos.

SO2

box_plot_func(y_str = "total.sulfur.dioxide", 
              yl = "Total SO2 (g / dm^3)",
              t = "SO2 pela Qualidade")

by(wineQualityReds$total.sulfur.dioxide, wineQualityReds$quality.label,  summary)
## wineQualityReds$quality.label: ruim
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    7.00   13.50   26.00   34.44   48.00  119.00 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: bom
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     6.0    24.0    40.0    48.9    65.0   165.0 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: ótimo
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    7.00   17.00   27.00   34.89   43.00  289.00

Por incrível que pareça, vinhos classificados como ótimos e ruins possuem um comportamento similar para essa variável. Além disso existem alguns outliers, principalmentes nos vinhos classificados como ótimos.

Alcohol

box_plot_func(y_str = "alcohol", 
              yl = "Álcool (% of volume)",
              t = "Álcool pela Qualidade")

by(wineQualityReds$alcohol, wineQualityReds$quality.label,  summary)
## wineQualityReds$quality.label: ruim
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    8.40    9.60   10.00   10.22   11.00   13.10 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: bom
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    8.40    9.50   10.00   10.25   10.90   14.90 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: ótimo
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    9.20   10.80   11.60   11.52   12.20   14.00

Aqui conseguimos ver que os vinhos classificados como ótimos possuem uma quantidade maior de álcool em sua composição. Vinhos bons e ruins são praticamente idênticos.

Sulphates

box_plot_func(y_str = "sulphates", 
              yl = "Sulphates (g / dm^3)",
              t = "Sulphates by Quality")

by(wineQualityReds$sulphates, wineQualityReds$quality.label,  summary)
## wineQualityReds$quality.label: ruim
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3300  0.4950  0.5600  0.5922  0.6000  2.0000 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: bom
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3700  0.5400  0.6100  0.6476  0.7000  1.9800 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: ótimo
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3900  0.6500  0.7400  0.7435  0.8200  1.3600

Muito legal essa variável, podemos ver que ela possui um comportamento diferente para as três classificações de qualidade :)

Chlorides

box_plot_func(y_str = "chlorides", 
              yl = "Chlorides (g / dm^3)",
              t = "Chlorides by Quality")

by(wineQualityReds$chlorides, wineQualityReds$quality.label,  summary)
## wineQualityReds$quality.label: ruim
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.04500 0.06850 0.08000 0.09573 0.09450 0.61000 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: bom
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.03400 0.07100 0.08000 0.08897 0.09100 0.61100 
## -------------------------------------------------------- 
## wineQualityReds$quality.label: ótimo
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.01200 0.06200 0.07300 0.07591 0.08500 0.35800

Possui um comportamento um tanto quanto similar entre as qualidades boa e ruim, mas já para a ótima ela tem um comportamento diferente :)

Você observou algum relacionamento interessante entre os outros atributos (os que não são de interesse)?

Aprentemente a qualidade do vinho depende das seguintes características: - Álcool - Sulfatos - Volatilidade do ácido - Ácido cítrico

Seção de Gráficos Multivariados

Chlorides vs pH by Quality

Não consegui tirar nenhuma conclusão a partir desse gráfico.

Sulphates vs pH by Quality

Essa visualização ficou um tanto quanto poluída né? Irei refazê-la, porém excluindo os vinhos bons… vamos ver como que fica!

Agora já fica muito mais claro uma conclusão :) Podemos ver claramente que em geral os vinhos classificados como ruins possuem uma quantidade menor de sulphates e um pH relativamente mais alto em alguns casos.

Citric acid vs pH by Quality rank

Aparentemente, vinhos com um pH menor do que 3.5 e com mais de 0.25 de ácido cítrico tendem a ter uma qualidade superior aos outros :)

Vamos olhar para a coluna sulphates mais de perto

Parece que vinhos bons tem menos de 50g de SO2 em sua composição! Mais uma evidencia :)

Aqui com esse gráfico fica bem claro que vinhos bons, em geral, possuem uma gradação alcóolica maior do que 10% e sulphates maior do que 0.6

Gráficos finais e sumário

Primeiro Gráfico

density_plot_func(col = "quality.label",
                  x_str = "alcohol",
                  xl = "Alcohol (% of volume)",
                  t = "Alcohol density\n by quality rank",
                  lt = "Quality")+
                  theme(legend.justification = c(1, 1), 
                  legend.position = c(1, 1))

Descrição do primeiro gráfico

A ideia da criação de gráfico foi para olhar um pouco mais a fundo em uma das variáveis que mais impactam na qualidade do vinho, o álcool. Quis mostrar os diferentes níveis de percentual alcóolico em vinhos bons, ruins e ótimos. Nitidamente vemos que vinhos bons possuem um percentual alcóolico maior em relação aos outros :)

Além do gráfico, podemos ver na tabela abaixo que realmente existe uma diferença entre cada tipo de vinho :)

A distribuição dos vinhos ótimos e bons é unimodal, enquanto que a de vinhos ruins é bimodal. A maior concentração do teor alcóolico em vinhos bons está em pouco menos de 10%, enquanto que vinhos ótimos está perto de 12%.

Segundo Gráfico

final_plot_two_1 = ggplot(data = wineQualityReds, 
                          aes(x = quality.label, 
                          y = sulphates, 
                          fill = quality.label)) +
                          geom_boxplot() +
                          xlab("Quality rank") +
                          ylab("Sulphates (g / dm^3)") +
                          ggtitle("Sulphates by quality rank") +
                          coord_cartesian(ylim = c(0.4, 0.9)) +
                          theme(legend.justification = c(1, 0), 
                                legend.position = c(1, 0))

final_plot_two_2 = point_plot_func(x_str = "citric.acid", 
                                   y_str = "sulphates", 
                                   yl = "Sulphates (g / dm^3)", 
                                   xl = "Citric Acid (g / dm^3)", 
                                   t = "Sulphates vs Citric Acid by Quality") +
                                  coord_cartesian(ylim = c(0.2, 1.2)) + 
                                  theme(legend.justification = c(1, 0), 
                                        legend.position = c(1, 0))

grid.arrange(final_plot_two_1, final_plot_two_2, ncol = 2)

Descrição do Segundo Gráfico

O comportamento da variável sulphates tem um comportamento bem diferente em relação aos três tipos, isso é muito bom :)

No segundo gráfico vemos que em geral, vinhos bons possuem o nível de sulphates maior do que 0.6.

Outra observação é em relação ao segundo gráfico, que mostra a relação entre o nível de sulphates e citric.acid. Podemos perceber que vinhos classicados como ótimo em geral possuem um maior nível de citric.acid e também de sulphates.

Um ponto de observação é em relação ao gráfico Sulphates vc Citric Acid by Quality. Ele está um tanto quanto poluído. Irei fazê-lo novamente, porém agora somente com vinhos ótimos e ruins:

plotData = subset(wineQualityReds, quality.label != 'bom')
ggplot( data = plotData, aes_string(x = plotData$citric.acid, 
                                    y = plotData$sulphates, 
                                    color = plotData$quality.label)) +
                geom_point(size = 3, alpha = 0.5, position = "jitter")+
                xlab('Citric Acid (g / dm^3)')+
                ylab('Sulphates (g / dm^3)')+    
                ggtitle('Sulphates vc Citric Acid by Quality') +
                scale_color_brewer(palette="Set1", guide = guide_legend(title = 'Quality', reverse = T))

Agora sim conseguimos ver de maneira clara como essas duas variáveis estão relacionadas e interferem na qualidade do vinho! :) Basicamente quando o nível de sulphates é menor do que 0.6, o vinho, em geral, não é de qualidade boa! (como mencionei acima)

Terceiro Gráfico

ggplot()+
  geom_point(alpha = 0.5, 
             data = wineQualityReds, 
             aes(x = volatile.acidity,
                 y = citric.acid, 
                 color = quality.label), 
                size = 2) +
  scale_x_continuous(breaks = seq(0, 1.6, 0.2)) +    
  ylab("Citric acid  (g / dm^3)") +
  xlab("Volatle acidity  (g / dm^3)") +    
  ggtitle("Citric acid vs Volatile acidity by quality rank") +
  scale_color_brewer(palette = "Spectral",
                     type = 'div',
                     guide = guide_legend(title = 'Quality', reverse = T)) +  
  theme(plot.title = element_text(size = 12),
        legend.justification = c(1, 1), 
        legend.position = c(1, 1))

Descrição do Terceiro Gráfico

A ideia de fazer esse gráfico foi verificar a relação entre as variáveis citric.acid e volatile.acidity nos diferentes níveis de qualidade. Podemos ver claramente que quão menor o nível de volatile.acidity e maior o de citric.acid, melhor será a qualidade do vinho. Vinhos classificados como ruins tem um alto valor de volatile.acidity e um baixíssimo de citric.acid :)


Reflexão

Quando vi que teria a oportunidade de estudar esse dataset eu fiquei muito animado! Não sou um grande entendedor de vinhos, mas sou de família italiana, ou seja, ao invés de sangue é vinho que corre em minhas veias :P

Confesso que ao iniciar esse projeto eu não fazia ideia do que mais tem influência na qualidade. Aí para ver isso já de maneira bem rápida, eu usei a função cor(), que me mostrou que as variáveis que mais influenciam são SO2, sulphates, pH, acidity e alcohol.

Para comprovar isso, fiz todos os gráficos. E analisando-os, realmente vi que os vinhos de qualidade boa se concentram em determinadas regiões dos gráficos para cada variável.

Tive algumas dificuldades durante o processo, principalmente por não entender direito o comportamento de cada variável na qualidade do vinho. Eu realmente não sabia por onde começar, por quais variáveis combinar e assim por diante! Conhecer pacotes como o cor() foi essencial para que eu conseguisse realizar esse projeto :)

Como sugestão para um trabalho futuro, acho que seria bem legal adicionar uma variável que seria o tipo do vinho e a região de onde ele foi feito. Pelo menos eu acho que a região tem um fator relativamente importante na qualidade … Ahh, outra coisa, a safra, i.é, o mês que ele foi produzido.. acho que cruzar isso com dados metereológicos pode dar muitos insights :)